/**
 * @author 孤雪唯方
 * @date 2025/05/15
 * @description 人类，用于验证object类
 */
public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object obj) {
        //进行过滤，如果obj为null，则返回false
        if (obj == null) {
            return false;
        }
        //如果obj为同一个对象，则返回true
        if (this == obj) {
            return true;
        }


        // 验证obj是否为Person类型,如果不是则返回false
        if (!(obj instanceof Person)) {
            return false;
        }
        //在验证obj是否为Person类型后，可以安全的转型为Person类型
        Person person = (Person) obj;

        // 验证name和age是否相等
        //这里this是指调用equals方法的Person对象，person是指传入的Person对象
        return (this.name == person.name) &&
               (this.age == person.age);
    }

    public static void main(String[] args) {
        int a = 10;
        int b = 10;
        int c = 0;
        System.out.println(a == b);// true
        System.out.println(a == c); // false
        System.out.println("上面为内置类型比较");

        Person person = new Person("孤雪唯方", 25);
        Person person2 = new Person("孤雪唯方", 25);
        Person person3 = new Person("孤雪唯方", 26);

        // 验证equals方法,此处会比较两个person对象的内存地址是否相同，所以结果为false，即person和person2，person2和person3，person和person3是两个不同的对象
        System.out.println(person == person2); // false
        System.out.println(person2 == person3); // false
        System.out.println(person == person3); // false
        System.out.println("上面为自定义类型直接比较");

/*
        //验证equals方法，当Person类没有重写equals方法时，此处会调用的是Object类的equals方法，此处还是比较内存地址，故结果为false
        System.out.println(person.equals(person2)); // true
        System.out.println(person2.equals(person3));
        System.out.println(person.equals(person3)); // false
        System.out.println("上面为自定义类型调用equals方法比较");
*/


        System.out.println(person.equals(person2)); // true
        System.out.println(person2.equals(person3));
        System.out.println(person.equals(person3)); // false
        System.out.println("上面为自定义类型调用equals方法比较");

        //尝试通过直接调用Person对象的方式打印person对象的name和age属性，这时我们发现系统会调用toString方法，而toString方法没有被重写，所以会打印出对象的内存地址
        System.out.println(person);
        System.out.println(person2);
        System.out.println(person3);

        //当我们直接打印内置类型时，就没有上述问题
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);

        //当我们重写toString方法时，系统会调用toString方法打印对象信息
    }
}
